module button_unit(
    clk, reset, ButtonIn, ButtonOut
);
  parameter sim = 0;

  input clk, reset, ButtonIn;
  output ButtonOut;
  reg mid1, mid2, mid3, mid4;

  // 同步
  dffre dffreInst1(
    .d(ButtonIn), .en(1'b1), .r(1'b0), .clk(clk), .q(mid1)
  );
  dffre dffreInst2(
    .d(mid1), .en(1'b1), .r(1'b0), .clk(clk), .q(mid2)
  );

  debouncer #(.sim(sim)) debouncerInst(
    .clk(clk), .reset(reset), .in(mid2), .out(mid3)
  );

  dffre dffreInst3(
    .d(mid3), .en(1'b1), .r(1'b0), .clk(clk), .q(mid4)
  );

  assign ButtonOut = ~mid4 & mid3;

endmodule